<?php

namespace App\Http\Controllers\WeChat;

use App\Models\TemplateMessage;
use EasyWeChat\Foundation\Application;

/**
 * Class WeChatController
 * @package App\Http\Controllers\WeChat
 * 微信trait
 */
trait WxTrait
{
    /**
     * 1. 支付成功提醒:
     *  {{first.DATA}}
        支付金额：{{keyword1.DATA}}
        支付时间：{{keyword2.DATA}}
        支付方式：{{keyword3.DATA}}
        {{remark.DATA}}
     *
     * 2. 业务处理通知
     *  {{first.DATA}}
        业务类型：{{keyword1.DATA}}
        业务状态：{{keyword2.DATA}}
        业务内容：{{keyword3.DATA}}
        {{remark.DATA}}
     *
     */
    private $messageType=[
        1=>[
            'title'=>'支付成功提醒',
            'template_id'=>'cxhS3q4Blad4YC69KpS3jdD26iHtXCMWiInnxWh1DUg'
        ],
        2=>[
            'title'=>'业务处理通知',
            'template_id'=>'vcFOqcGoKZBTNkyNT1CmROkHYFrIF9gVE6PJXQGm7tA'
        ],
    ];//当前公众号申请到的模板消息

    /**
     * 名称：发送微信模板消息
     * 必要条件：依赖表：wx_template_message
     * 功能：发送模板消息的trait,api和admin 都会调用
     * 任务：
     * 1.发送微信模板消息
     * 2.成功后更新数据库
     */
    public function sendTemplateMessage($id)
    {
        $wechat=app('wechat');
        $messageData=TemplateMessage::find($id);
        if(!$messageData){
            return ['result'=>0,'message'=>'不存在的模板消息'];
        }
        if($messageData->have_send!=0){
            return ['result'=>0,'message'=>'该模板消息已被发送,不可重复发送'];
        }
        if(!$messageData->openid || !$messageData->template_id){
            return ['result'=>0,'message'=>'数据不完整，不能发送此模板消息'];
        }
        $notice = $wechat->notice;

        $data=json_decode($messageData->content,true);
            if(!$data || !is_array($data)){
            return ['result'=>0,'message'=>'数据不完整，不能发送此模板消息'];
        }

        $result = $notice->uses($messageData->template_id)->withUrl($messageData->url)->andData($data)->andReceiver($messageData->openid)->send();

        $result=json_decode($result);
        $messageData->msgid=$result->msgid;
        $messageData->errcode=$result->errcode;
        $messageData->errmsg=$result->errmsg;
        if($result->errcode==0){
            $messageData->have_send=1;//发送成功
        }
        $messageData->save();
        if($messageData->have_send==1){
            return ['result'=>1,'message'=>'发送成功'];

        }else{
            return ['result'=>0,'message'=>'发送失败'];
        }


    }

    /**
     * 名称：准备模板消息
     * 必要条件:openid,messageTypeId,content,url
     * 功能：将需要发送的模板消息存入数据库，并发送。
     * 任务：
     */
    public function prepareMessage($openid,$messageTypeId,$content,$url=''){
        if(!$openid || !$messageTypeId || !$content){
            return ['result'=>0,'message'=>'发送失败，未生成数据'];
        }
        $data=[
            'openid'=>$openid,
            'title'=>$this->messageType[$messageTypeId]['title'],
            'content'=>json_encode($content),
            'template_id'=>$this->messageType[$messageTypeId]['template_id'],
            'have_send'=>0,
            'url'=>$url,
            'msgid'=>0,
            'errcode'=>0,
            'errmsg'=>' '
        ];
        $templateMessage=TemplateMessage::create($data);
        if(!$templateMessage){
            return ['result'=>0,'message'=>'发送失败，未生成数据'];
        }

        $res=$this->sendTemplateMessage($templateMessage->id);
        if($res['result']){
            return ['result'=>1,'message'=>'发送成功'];
        }else{
            return ['result'=>0,'message'=>'发送失败','failId'=>$templateMessage->id];
        }

    }


}
